package cn.tedu.charging.order.mqtt;

import cn.tedu.charging.order.common.MqttConstants;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;

/**
 * 消息消费者
 * 订单服务 用来接受 设备发送的消息
 */
@Slf4j
public class MqttConsumer implements MqttCallbackExtended {
    private MqttClient mqttClient;

    /**
     * setter 写方法
     * @param mqttClient
     */
    public MqttConsumer(MqttClient mqttClient){
        this.mqttClient = mqttClient;
    }



    /**
     * 订单服务和EQMX连接成功 回调此方法
     * @param reconnect
     * @param serverURI
     */
    public void connectComplete(boolean reconnect,String serverURI){
        log.debug("连接成功");
        //和EMQX 建立连接后 订阅 设备返回的 开始充电结果的topic
        String topic = MqttConstants.TOPIC_START_RESULT;

        try {
            log.debug("订单服务订阅 设备返回的<<开始充电结果>> Topic:{}",topic);
            mqttClient.subscribe(topic);
            log.debug("订单服务订阅 设备返回的<<开始充电结果>> Topic:{},成功",topic);
        } catch (MqttException e) {
            log.error("订单服务订阅 Topic:{},失败：{}",topic,e);
        }
    }

    /**
     * 订单服务 和 EQMX 连接失败 回调此方法
     * @param cause the reason behind the loss of connection.
     */
    @Override
    public void connectionLost(Throwable cause) {
        log.debug("连接断开");
    }

    /**
     * 消息到达
     * 消息message 到达topic 能收到消息的前提 是 需要订阅 topic
     * 消息 从 设备 到达订单
     * @param topic name of the topic on the message was published to
     * @param message the actual message.
     * @throws Exception
     */
    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        log.debug("收到消息：{}，Topic：{}",message,topic);
    }

    /**
     * 消息发送完成
     * 订单 发送 给EMQX 完成 回调此方法
     * @param token the delivery token associated with the message.
     */
    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        log.debug("消息发送完成");
    }
}
